import OnePara = require('./OnePara');
import FMatrix = require('./FMatrix');
import ParaChar=require('./ParaChar');
export = ParaContour;



/**
 * 多段文字
 * @author jackliu
 *
 */
class ParaContour {
    
    // 包含多个单行段落
    public paras:Array<OnePara> = new Array<OnePara>();
    public w = 0;
    public h = 0;
    
    public m:FMatrix=null; // 变换矩阵（相对于原始轮廓（从服务器返回的轮廓）的绝对缩放矩阵）
    
	public constructor() {
	}
	
	
    // 转成json字符串
    // 参数： frame为true，表示转成frame（所谓frame指的是文字的每个字的x、y、w、h，但不包括文字的每个点）
    public toJson(frame? ):string{
        frame = (typeof frame ==undefined || typeof frame ==undefined)? false:frame;
        
        var ret = '{';
        ret +='"paras":[';
        for(var i=0;i<this.paras.length;i++){
            if(i>0){
                ret +=',';
            }
            ret += this.paras[i].toJson(frame );
        }
        ret +=']';
        ret +=',';
        ret +=('"w":'+this.w);
        ret +=',';
        ret +=('"h":'+this.h);
        // matrix
        if(this.m){
            ret +=',';
            ret +=('"m":'+this.m.toJson());
        }
        ret +='}';
        return ret;
    }
    // 从json对象中解析
    // 参数： frame为true，表示从frame中解析（所谓frame指的是文字的每个字的x、y、w、h，但不包括文字的每个点）
    public fromJson (jsonObj, versionId, frame?){
        frame = (typeof frame ==undefined || typeof frame ==undefined)? false:frame;
        
        this.paras.splice(0,this.paras.length);
        if(jsonObj && jsonObj.hasOwnProperty('paras')){
            for(var i=0;i<jsonObj.paras.length;i++){
                var para= new OnePara();
                para.fromJson(jsonObj.paras[i],versionId,frame);
                this.paras.push(para);
            }
        }
        this.w = jsonObj.w*1;
        this.h = jsonObj.h*1;
        
        // matrix
        if(jsonObj.hasOwnProperty('m')){
            this.m = new FMatrix();
            this.m.fromJson(jsonObj.m);
        }
    }
    // 从文字服务器返回的数据，创建ParaContour
    public static fromFontServerData(text: string,data): ParaContour{
        var arrStr: string[]=text.split("\n");
        var pc: ParaContour=new ParaContour();
        var tmpCnt: number=0;// 每算完一行后，累加
        for(var n=0;n<arrStr.length;n++) {// 行数
            var cnt=arrStr[n].length;// 行字符数
            
            var paraObj: OnePara=new OnePara();
            for(var i=0;i<cnt;i++) {
                // 循环解析文字
                var charObj: ParaChar=new ParaChar();
                if((tmpCnt+i)<data.length) {
                    charObj.fromJson(data[tmpCnt+i],0);
                    // 加入文字段
                    paraObj.chars.push(charObj);
                }
            }

            tmpCnt+=cnt;
            pc.paras.push(paraObj);
        }
        return pc;
    }
    
    /**
* 转换成SVG格式的字符串：
*      'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z
*       M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z'
*/
    public toSvgPath=function() {
        var ret="";
        for(var i=0;i<this.paras.length;i++) {
            if(i>0)
                ret+=" ";
            ret+=this.paras[i].toSvgPath();
        }
        return ret;
    }
    
    /**
* 转换成SVG格式的字符串数组：
*      ['M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z',
*       'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z']
*/
    public toSvgPathArray=function(): Array<string> {
        var ret: Array<string>=new Array<string>();
        for(var i=0; i<this.paras.length; i++) {
            ret = ret.concat(this.paras[i].toSvgPathArray());
        }
        return ret;
    }
    
    /**
        * 转换成GM使用的SVG格式的字符串，多个字之间以空格分隔：
        *     'path "M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z"  
        *        path "M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z"'
        */
    public toSvgPathForGM=function(): string {
        var ret="";
        for(var i=0;i<this.paras.length;i++) {
            if(i>0)
                ret+=" ";
            ret+=this.paras[i].toSvgPathForGM();
        }
        return ret;
    }
    
    // 调整复合路径，平移或者缩放
    // 参数
    //		charContour:复合路径
    //		vW:水平方向的平移值或者缩放值
    //		vH:垂直方向的平移值或者缩放值
    // 		type:类型，1 平移  2 缩放
    public adjustPosition(vW,vH,type) {
        for(var i=0;i<this.paras.length;i++) {
            this.paras[i].adjustPosition(vW,vH,type);
        }
    }
    // 复制
    public copy():ParaContour{
        var ret: ParaContour=new ParaContour();
        ret.fromJson(JSON.parse(this.toJson()),0);
        return ret;
    }
    
//SJG_MARK_APPEND--------------------


}//SJG_MARK_END-------------------------